home *** CD-ROM | disk | FTP | other *** search
/ Belgian Amiga Club - ADF Collection / BS1 part 34.zip / BS1 part 34 / FredFish PD 303.adf / IceFrac / IceFrac.c < prev    next >
C/C++ Source or Header  |  1990-01-08  |  27KB  |  771 lines

  1. /* IceFrac.c - Diffusion Limited Aggregation simulator */
  2. /* Version 2.2 */
  3. /* (c) 1989 by Lars R. Clausen */
  4. /* PaletteReq (c) 1989 by Jonathan Potter */
  5. #include <exec/types.h>
  6. #include <graphics/gfxbase.h>
  7. #include <graphics/view.h>
  8. #include <intuition/intuition.h>
  9. #include <libraries/iff.h>
  10. #include <stdio.h>
  11. #include <hardware/blit.h>
  12. #include <hardware/dmabits.h>
  13. #include <math.h>
  14. #include <PaletteReq.h>
  15.  
  16. /*#define USEBLIT*/
  17.  
  18. void *OpenLibrary();
  19. struct Window *OpenWindow();
  20. struct Screen *OpenScreen();
  21. struct IntuiMessage *GetMsg();
  22.  
  23. struct IntuitionBase *IntuitionBase;
  24. struct GfxBase *GfxBase;
  25. struct Library *IFFBase = NULL;
  26. struct Window *w;
  27. struct Screen *s;
  28.  
  29. long code=1,ColCount=250,ColJump=250,Planes=5;
  30. int *BZero = (0xdff002L);
  31. char ifffile[] = "FracPic001";
  32. unsigned char MoveBits=224;
  33. unsigned char TestBits=224;
  34. int Die=1,XSize=320,YSize=255,A1MinX=2,A1MinY=252,A1MaxX=317,A1MaxY=252;
  35. int EnterOnEdge=1,A2MinX=-1,A2MinY=127,A2MaxX=160,A2MaxY=127,MaxIt=100,Margin=2;
  36.  
  37. char UndoBuff[4],XSBuff[4]="320",YSBuff[4]="255",A1XMinBuff[4]="2",
  38. A1YMinBuff[4]="252",A1XMaxBuff[4]="317",A1YMaxBuff[4]="252",A2XMinBuff[4]="-1",
  39. A2YMinBuff[4]="127",A2XMaxBuff[4]="160",A2YMaxBuff[4]="127",MIBuff[4]="100",
  40. MargBuff[4]="2",ColBuff[4]="250";
  41. char HiRes=0,Lace=0,Pal=1,A2Off=1;
  42. struct Gadget BigGad = { NULL,0,0,320,255,GADGHNONE,RELVERIFY|FOLLOWMOUSE|
  43.     GADGIMMEDIATE,BOOLGADGET,NULL,NULL,NULL,NULL,NULL,0,NULL};
  44.  
  45. struct NewScreen ns = {0,0,320,256,5,1,2,NULL,CUSTOMSCREEN,NULL,NULL,NULL,NULL};
  46.  
  47. struct NewWindow nw = {
  48.     0,1,320,255,-1,-1,GADGETUP|MOUSEMOVE|VANILLAKEY|GADGETDOWN,NOCAREREFRESH|ACTIVATE|BORDERLESS,
  49.     &BigGad,NULL,NULL, NULL,NULL,0,0,0,0,CUSTOMSCREEN};
  50.  
  51. short ColorMap[32] = {     /* format 0x0RGB */
  52.  /*  0-7  */  0x0000,0x0FFF,0x0DDF,0x0CCF,0x0AAF,0x099F,0x077F,0x066F ,
  53.  /*  8-15 */  0x044F,0x046D,0x047B,0x0489,0x0496,0x04B4,0x04D2,0x04F0 ,
  54.  /* 16-23 */  0x06F0,0x08F0,0x0BF0,0x0DF0,0x0FF0,0x0FD0,0x0FB0,0x0F90 ,
  55.  /* 24-31 */  0x0F70,0x0F50,0x0F00,0x0F55,0x0F77,0x0F99,0x0FBB,0x0FDD };
  56.  
  57. SHORT GadPairs[6][10]={{-1,-1,49,-1,49,9,-1,9,-1,-1},{-2,-2,33,-2,33,9,-2,9,-2,-2},
  58. {0,0,4,0,4,4,0,4,0,0},{-1,-1,25,-1,25,9,-1,9,-1,-1},{-1,-1,34,-1,34,9,-1,9,-1,-1},
  59. {-1,-1,149,-1,149,9,-1,9,-1,-1}};
  60. struct Border Gad6Bord={0,0,3,0,JAM2,5,(SHORT *)GadPairs[0],NULL};
  61. struct Border Gad4Bord={0,0,3,0,JAM2,5,(SHORT *)GadPairs[1],NULL};
  62. struct Border Gad4Bordb={0,0,3,0,JAM2,5,(SHORT *)GadPairs[4],NULL};
  63. struct Border MiniBord={0,0,3,0,JAM2,5,(SHORT *)GadPairs[2],NULL};
  64. struct Border Gad3Bord={0,0,3,0,JAM2,5,(SHORT *)GadPairs[3],NULL};
  65. struct Border Gad13Bord={0,0,3,0,JAM2,5,(SHORT *)GadPairs[5],NULL};
  66. struct IntuiText GadText[8]=
  67. {{1,0,JAM1,1,1,NULL,(UBYTE *)"Regrow",NULL},
  68.  {1,0,JAM1,5,1,NULL,(UBYTE *)"Go On",NULL},
  69.  {1,0,JAM1,1,1,NULL,(UBYTE *)"Cancel",NULL},
  70.  {11,0,JAM1,1,1,NULL,(UBYTE *)"Die",NULL},
  71.  {11,0,JAM1,1,1,NULL,(UBYTE *)"Edge",NULL},
  72.  {1,0,JAM1,1,1,NULL,(UBYTE *)"Make",NULL},
  73.  {1,0,JAM1,1,1,NULL,(UBYTE *)"Make",NULL},
  74.  {1,0,JAM1,1,1,NULL,(UBYTE *)"   Change Colors",NULL}};
  75. struct StringInfo StrInfo[13]=
  76. {{(UBYTE *)&XSBuff[0],(UBYTE *)&UndoBuff[0],0,4,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL},
  77.  {(UBYTE *)&YSBuff[0],(UBYTE *)&UndoBuff[0],0,4,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL},
  78.  {(UBYTE *)&A1XMinBuff[0],(UBYTE *)&UndoBuff[0],0,4,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL},
  79.  {(UBYTE *)&A1YMinBuff[0],(UBYTE *)&UndoBuff[0],0,4,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL},
  80.  {(UBYTE *)&A1XMaxBuff[0],(UBYTE *)&UndoBuff[0],0,4,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL},
  81.  {(UBYTE *)&A1YMaxBuff[0],(UBYTE *)&UndoBuff[0],0,4,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL},
  82.  {(UBYTE *)&A2XMinBuff[0],(UBYTE *)&UndoBuff[0],0,4,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL},
  83.  {(UBYTE *)&A2YMinBuff[0],(UBYTE *)&UndoBuff[0],0,4,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL},
  84.  {(UBYTE *)&A2XMaxBuff[0],(UBYTE *)&UndoBuff[0],0,4,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL},
  85.  {(UBYTE *)&A2YMaxBuff[0],(UBYTE *)&UndoBuff[0],0,4,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL},
  86.  {(UBYTE *)&MIBuff[0],(UBYTE *)&UndoBuff[0],0,4,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL},
  87.  {(UBYTE *)&MargBuff[0],(UBYTE *)&UndoBuff[0],0,4,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL},
  88.  {(UBYTE *)&ColBuff[0],(UBYTE *)&UndoBuff[0],0,4,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL}};
  89. struct Gadget DMReqGadget[37] =
  90. {{NULL,5,152,49,9,GADGHCOMP,RELVERIFY|GADGIMMEDIATE|ENDGADGET|TOGGLESELECT,
  91. BOOLGADGET,(APTR)&Gad6Bord,NULL,&GadText[0],0,0,0,0},
  92. {&DMReqGadget[0],105,152,49,9,GADGHCOMP,RELVERIFY|GADGIMMEDIATE|ENDGADGET|TOGGLESELECT
  93. ,BOOLGADGET,(APTR)&Gad6Bord,NULL,&GadText[2],0,0,1,0},
  94. {&DMReqGadget[1],68,21,25,9,GADGHCOMP|SELECTED,RELVERIFY|GADGIMMEDIATE|TOGGLESELECT
  95. ,BOOLGADGET,(APTR)&Gad3Bord,NULL,&GadText[3],0,0,2,0},
  96. {&DMReqGadget[2],50,2,5,5,GADGHCOMP,RELVERIFY|GADGIMMEDIATE|
  97. TOGGLESELECT,BOOLGADGET,(APTR)&MiniBord,NULL,NULL,0,0,3,0},
  98. {&DMReqGadget[3],55,2,5,5,GADGHCOMP,RELVERIFY|GADGIMMEDIATE|
  99. TOGGLESELECT,BOOLGADGET,(APTR)&MiniBord,NULL,NULL,0,0,4,0},
  100. {&DMReqGadget[4],60,2,5,5,GADGHCOMP,RELVERIFY|GADGIMMEDIATE|
  101. TOGGLESELECT,BOOLGADGET,(APTR)&MiniBord,NULL,NULL,0,0,5,0},
  102. {&DMReqGadget[5],50,7,5,5,GADGHCOMP,RELVERIFY|GADGIMMEDIATE|
  103. TOGGLESELECT,BOOLGADGET,(APTR)&MiniBord,NULL,NULL,0,0,6,0},
  104. {&DMReqGadget[6],60,7,5,5,GADGHCOMP,RELVERIFY|GADGIMMEDIATE|
  105. TOGGLESELECT,BOOLGADGET,(APTR)&MiniBord,NULL,NULL,0,0,7,0},
  106. {&DMReqGadget[7],50,12,5,5,GADGHCOMP|SELECTED,RELVERIFY|GADGIMMEDIATE|
  107. TOGGLESELECT,BOOLGADGET,(APTR)&MiniBord,NULL,NULL,0,0,8,0},
  108. {&DMReqGadget[8],55,12,5,5,GADGHCOMP|SELECTED,RELVERIFY|GADGIMMEDIATE|
  109. TOGGLESELECT,BOOLGADGET,(APTR)&MiniBord,NULL,NULL,0,0,9,0},
  110. {&DMReqGadget[9],60,12,5,5,GADGHCOMP|SELECTED,RELVERIFY|GADGIMMEDIATE|
  111. TOGGLESELECT,BOOLGADGET,(APTR)&MiniBord,NULL,NULL,0,0,10,0},
  112. {&DMReqGadget[10],115,2,5,5,GADGHCOMP,RELVERIFY|GADGIMMEDIATE|
  113. TOGGLESELECT,BOOLGADGET,(APTR)&MiniBord,NULL,NULL,0,0,11,0},
  114. {&DMReqGadget[11],120,2,5,5,GADGHCOMP,RELVERIFY|GADGIMMEDIATE|
  115. TOGGLESELECT,BOOLGADGET,(APTR)&MiniBord,NULL,NULL,0,0,12,0},
  116. {&DMReqGadget[12],125,2,5,5,GADGHCOMP,RELVERIFY|GADGIMMEDIATE|
  117. TOGGLESELECT,BOOLGADGET,(APTR)&MiniBord,NULL,NULL,0,0,13,0},
  118. {&DMReqGadget[13],115,7,5,5,GADGHCOMP,RELVERIFY|GADGIMMEDIATE|
  119. TOGGLESELECT,BOOLGADGET,(APTR)&MiniBord,NULL,NULL,0,0,14,0},
  120. {&DMReqGadget[14],125,7,5,5,GADGHCOMP,RELVERIFY|GADGIMMEDIATE|
  121. TOGGLESELECT,BOOLGADGET,(APTR)&MiniBord,NULL,NULL,0,0,15,0},
  122. {&DMReqGadget[15],115,12,5,5,GADGHCOMP|SELECTED,RELVERIFY|GADGIMMEDIATE|
  123. TOGGLESELECT,BOOLGADGET,(APTR)&MiniBord,NULL,NULL,0,0,16,0},
  124. {&DMReqGadget[16],120,12,5,5,GADGHCOMP|SELECTED,RELVERIFY|GADGIMMEDIATE|
  125. TOGGLESELECT,BOOLGADGET,(APTR)&MiniBord,NULL,NULL,0,0,17,0},
  126. {&DMReqGadget[17],125,12,5,5,GADGHCOMP|SELECTED,RELVERIFY|GADGIMMEDIATE|
  127. TOGGLESELECT,BOOLGADGET,(APTR)&MiniBord,NULL,NULL,0,0,18,0},
  128. {&DMReqGadget[18],45,43,32,10,GADGHCOMP,GADGIMMEDIATE,STRGADGET,(APTR)&Gad4Bord,
  129. 0,0,0,(APTR)&StrInfo[0],19,0},
  130. {&DMReqGadget[19],121,43,32,10,GADGHCOMP,GADGIMMEDIATE,STRGADGET,(APTR)&Gad4Bord,
  131. 0,0,0,(APTR)&StrInfo[1],20,0},
  132. {&DMReqGadget[20],7,76,32,10,GADGHCOMP,GADGIMMEDIATE,STRGADGET,(APTR)&Gad4Bord,
  133. 0,0,0,(APTR)&StrInfo[2],21,0},
  134. {&DMReqGadget[21],45,76,32,10,GADGHCOMP,GADGIMMEDIATE,STRGADGET,(APTR)&Gad4Bord,
  135. 0,0,0,(APTR)&StrInfo[3],22,0},
  136. {&DMReqGadget[22],83,76,32,10,GADGHCOMP,GADGIMMEDIATE,STRGADGET,(APTR)&Gad4Bord,
  137. 0,0,0,(APTR)&StrInfo[4],23,0},
  138. {&DMReqGadget[23],121,76,32,10,GADGHCOMP,GADGIMMEDIATE,STRGADGET,(APTR)&Gad4Bord,
  139. 0,0,0,(APTR)&StrInfo[5],24,0},
  140. {&DMReqGadget[24],7,98,32,10,GADGHCOMP,GADGIMMEDIATE,STRGADGET,(APTR)&Gad4Bord,
  141. 0,0,0,(APTR)&StrInfo[6],25,0},
  142. {&DMReqGadget[25],45,98,32,10,GADGHCOMP,GADGIMMEDIATE,STRGADGET,(APTR)&Gad4Bord,
  143. 0,0,0,(APTR)&StrInfo[7],26,0},
  144. {&DMReqGadget[26],83,98,32,10,GADGHCOMP,GADGIMMEDIATE,STRGADGET,(APTR)&Gad4Bord,
  145. 0,0,0,(APTR)&StrInfo[8],27,0},
  146. {&DMReqGadget[27],121,98,32,10,GADGHCOMP,GADGIMMEDIATE,STRGADGET,(APTR)&Gad4Bord,
  147. 0,0,0,(APTR)&StrInfo[9],28,0},
  148. {&DMReqGadget[28],83,109,32,10,GADGHCOMP,GADGIMMEDIATE,STRGADGET,(APTR)&Gad4Bord,
  149. 0,0,0,(APTR)&StrInfo[10],29,0},
  150. {&DMReqGadget[29],83,120,32,10,GADGHCOMP,GADGIMMEDIATE,STRGADGET,(APTR)&Gad4Bord,
  151. 0,0,0,(APTR)&StrInfo[11],30,0},
  152. {&DMReqGadget[30],82,130,34,9,GADGHCOMP|SELECTED,RELVERIFY|GADGIMMEDIATE|
  153. TOGGLESELECT,BOOLGADGET,(APTR)&Gad4Bordb,NULL,&GadText[4],0,0,31,0},
  154. {&DMReqGadget[31],55,152,49,9,GADGHCOMP,RELVERIFY|GADGIMMEDIATE|ENDGADGET|TOGGLESELECT
  155. ,BOOLGADGET,(APTR)&Gad6Bord,NULL,&GadText[1],0,0,32,0},
  156. {&DMReqGadget[32],120,65,34,9,GADGHCOMP,RELVERIFY|GADGIMMEDIATE|ENDGADGET
  157. ,BOOLGADGET,(APTR)&Gad4Bordb,NULL,&GadText[5],0,0,33,0},
  158. {&DMReqGadget[33],120,87,34,9,GADGHCOMP,RELVERIFY|GADGIMMEDIATE|ENDGADGET
  159. ,BOOLGADGET,(APTR)&Gad4Bordb,NULL,&GadText[6],0,0,34,0},
  160. {&DMReqGadget[34],121,54,32,10,GADGHCOMP,GADGIMMEDIATE,STRGADGET,(APTR)&Gad4Bord,
  161. 0,0,0,(APTR)&StrInfo[12],35,0},
  162. {&DMReqGadget[35],5,140,149,9,GADGHCOMP,RELVERIFY|GADGIMMEDIATE,BOOLGADGET,(APTR)&Gad13Bord,
  163. 0,&GadText[7],0,NULL,36,0},
  164. };
  165.  
  166. struct Requester DMReq;
  167. SHORT ReqBorderPairs[10]={0,0,158,0,158,165,0,165,0,0};
  168. struct Border DMReqBorder={0,0,1,0,JAM2,5,(SHORT *)&ReqBorderPairs[0],NULL};
  169. struct IntuiText DMReqText[12]=
  170. {{1,0,JAM1,4,3,NULL,(UBYTE *)"Move:",NULL},
  171.  {1,0,JAM1,70,3,NULL,(UBYTE *)"Test:",&DMReqText[0]},
  172.  {1,0,JAM1,4,21,NULL,(UBYTE *)"Border:",&DMReqText[1]},
  173.  {1,0,JAM1,4,32,NULL,(UBYTE *)"Size:",&DMReqText[2]},
  174.  {1,0,JAM1,4,43,NULL,(UBYTE *)"X:",&DMReqText[3]},
  175.  {1,0,JAM1,84,43,NULL,(UBYTE *)"Y:",&DMReqText[4]},
  176.  {1,0,JAM1,4,65,NULL,(UBYTE *)"StartArea 1:",&DMReqText[5]},
  177.  {1,0,JAM1,4,87,NULL,(UBYTE *)"StartArea 2:",&DMReqText[6]},
  178.  {1,0,JAM1,4,109,NULL,(UBYTE *)"MaxIt:",&DMReqText[7]},
  179.  {1,0,JAM1,4,120,NULL,(UBYTE *)"Margin:",&DMReqText[8]},
  180.  {1,0,JAM1,4,131,NULL,(UBYTE *)"Enter on:",&DMReqText[9]},
  181.  {1,0,JAM1,4,54,NULL,(UBYTE *)"Color change:",&DMReqText[10]}};
  182.  
  183. MySetDMRequester()
  184. {
  185.     InitRequester(&DMReq);
  186.     DMReq.LeftEdge = 50;
  187.     DMReq.TopEdge = 30;
  188.     DMReq.Width = 159;
  189.     DMReq.Height = 166;
  190.     DMReq.RelLeft = -80;
  191.     DMReq.RelTop = -77;
  192.     DMReq.ReqGadget = &DMReqGadget[36];
  193.     DMReq.ReqText = &DMReqText[11];
  194.     DMReq.BackFill = 0;
  195.     DMReq.ReqBorder = &DMReqBorder;
  196.     DMReq.Flags |= POINTREL;
  197.     SetDMRequest(w,&DMReq);
  198. }
  199.  
  200. DrawBox(rp,startx,starty,endx,endy)
  201. struct RastPort *rp;
  202. long startx,starty,endx,endy;
  203. {
  204.     if ((startx!=endx)&&(starty!=endy))
  205.     {
  206.         Move(rp,startx,starty);
  207.         Draw(rp,endx,starty);
  208.         Draw(rp,endx,endy);
  209.         Draw(rp,startx,endy);
  210.         Draw(rp,startx,starty+1);
  211.     }
  212. }
  213.  
  214. GetSquare(fromx,fromy,nr)
  215. long fromx,fromy;
  216. int nr;
  217. {
  218.     struct IntuiMessage *msg;
  219.     long initx,inity,endx,endy,currx,curry,partx,party,t;
  220.     int invx=0,invy=0,i;
  221.     struct RastPort *rp;
  222.  
  223.     initx=fromx;inity=fromy;
  224.     rp=w->RPort;
  225.     endx=initx;endy=inity;
  226.     WaitPort(w->UserPort);
  227.     msg=(struct IntuiMessage *)GetMsg(w->UserPort);
  228.     SetDrMd(rp,COMPLEMENT);
  229.     for (;msg->Class==MOUSEMOVE;)
  230.     {
  231.         currx=msg->MouseX; curry=msg->MouseY; ReplyMsg(msg);
  232.         if ((invx==1)&&(currx>=initx)&&(currx<endx)) initx=currx;
  233.         if ((invy==1)&&(curry>=inity)&&(curry<endy)) inity=curry;
  234.         if ((invx==1)&&(currx>=initx)&&(currx>=endx)) { invx=0; initx=endx;endx=currx;}
  235.         if ((invy==1)&&(curry>=inity)&&(curry>=endy)) { invy=0; inity=endy;endy=curry;}
  236.         if ((currx>=initx)&&(invx==0)) endx=currx;
  237.         if ((curry>=inity)&&(invy==0)) endy=curry;
  238.         if ((currx<initx)&&(invx==0)) { invx=1; endx=initx; initx=currx;}
  239.         if ((curry<inity)&&(invy==0)) { invy=1; endy=inity; inity=curry;}
  240.         if (currx<initx) initx=currx;
  241.         if (curry<inity) inity=curry;
  242.         DrawBox(rp,initx,inity,endx,endy);
  243.         WaitPort(w->UserPort);
  244.         msg=(struct IntuiMessage *)GetMsg(w->UserPort);
  245.         DrawBox(rp,initx,inity,endx,endy);
  246.     }
  247.     if (nr==1)
  248.     {
  249.         sprintf(&A1XMinBuff[0],"%ld",initx);
  250.         sprintf(&A1XMaxBuff[0],"%ld",endx);
  251.         sprintf(&A1YMinBuff[0],"%ld",inity);
  252.         sprintf(&A1YMaxBuff[0],"%ld",endy);
  253.     }
  254.     else
  255.     {
  256.         sprintf(&A2XMinBuff[0],"%ld",initx);
  257.         sprintf(&A2XMaxBuff[0],"%ld",endx);
  258.         sprintf(&A2YMinBuff[0],"%ld",inity);
  259.         sprintf(&A2YMaxBuff[0],"%ld",endy);
  260.     }
  261.     SetDrMd(w->RPort,JAM1);
  262. }
  263.  
  264. int ChangePara()
  265. {
  266.     struct IntuiMessage *msg;
  267.     struct Gadget *hit;
  268.     int i=2,j=0,tmp;
  269.     
  270.     for (;w->Flags&INREQUEST;WaitPort(w->UserPort))
  271.     {
  272.         msg=GetMsg(w->UserPort);
  273.         if (msg->Class==GADGETDOWN)
  274.         {
  275.             hit = (struct Gadget *)msg->IAddress;
  276.             if ((hit->GadgetID > 32)&&(hit->GadgetID<35))
  277.             {
  278.                 do {} while (ClearDMRequest(w)==FALSE);
  279.                 do
  280.                 {
  281.                     ReplyMsg(msg);
  282.                     WaitPort(w->UserPort);
  283.                     msg=GetMsg(w->UserPort);
  284.                 }
  285.                 while (msg->Class!=GADGETDOWN);
  286.                 GetSquare((long)msg->MouseX,(long)msg->MouseY,hit->GadgetID-32);
  287.                 hit->Flags&=!SELECTED;
  288.                 SetDMRequest(w,&DMReq);
  289.                 Request(&DMReq,w);
  290.             }
  291.             if (hit->GadgetID == 36) palette_request(w,10L,10L,"Change Colors",NULL,Planes);
  292.             ReplyMsg(msg);
  293.         }
  294.     }
  295.     if (!(DMReqGadget[1].Flags&0x0080))
  296.     {
  297.         if (DMReqGadget[32].Flags&0x0080) {j=2;DMReqGadget[32].Flags&=0xFF7F;}
  298.         else {j=1; DMReqGadget[0].Flags&=0xFF7F;}
  299.         if (DMReqGadget[2].Flags&SELECTED) Die=1; else Die=0;
  300.         if (DMReqGadget[3].Flags&SELECTED) MoveBits|=0x01; else MoveBits&=0xFE;
  301.         if (DMReqGadget[4].Flags&SELECTED) MoveBits|=0x02; else MoveBits&=0xFD;
  302.         if (DMReqGadget[5].Flags&SELECTED) MoveBits|=0x04; else MoveBits&=0xFB;
  303.         if (DMReqGadget[6].Flags&SELECTED) MoveBits|=0x08; else MoveBits&=0xF7;
  304.         if (DMReqGadget[7].Flags&SELECTED) MoveBits|=0x10; else MoveBits&=0xEF;
  305.         if (DMReqGadget[8].Flags&SELECTED) MoveBits|=0x20; else MoveBits&=0xDF;
  306.         if (DMReqGadget[9].Flags&SELECTED) MoveBits|=0x40; else MoveBits&=0xBF;
  307.         if (DMReqGadget[10].Flags&SELECTED) MoveBits|=0x80; else MoveBits&=0x7F;
  308.         if (DMReqGadget[11].Flags&SELECTED) TestBits|=0x01; else TestBits&=0xFE;
  309.         if (DMReqGadget[12].Flags&SELECTED) TestBits|=0x02; else TestBits&=0xFD;
  310.         if (DMReqGadget[13].Flags&SELECTED) TestBits|=0x04; else TestBits&=0xFB;
  311.         if (DMReqGadget[14].Flags&SELECTED) TestBits|=0x08; else TestBits&=0xF7;
  312.         if (DMReqGadget[15].Flags&SELECTED) TestBits|=0x10; else TestBits&=0xEF;
  313.         if (DMReqGadget[16].Flags&SELECTED) TestBits|=0x20; else TestBits&=0xDF;
  314.         if (DMReqGadget[17].Flags&SELECTED) TestBits|=0x40; else TestBits&=0xBF;
  315.         if (DMReqGadget[18].Flags&SELECTED) TestBits|=0x80; else TestBits&=0x7F;
  316.         if (j==1) XSize=atoi(&XSBuff[0]);
  317.         if (j==1) { YSize=atoi(&YSBuff[0]); ChangeSize(); ColCount=0;}
  318.         A1MinX=atoi(&A1XMinBuff[0]);
  319.         A1MinY=atoi(&A1YMinBuff[0]);
  320.         A1MaxX=atoi(&A1XMaxBuff[0]);
  321.         A1MaxY=atoi(&A1YMaxBuff[0]);
  322.         A2MinX=atoi(&A2XMinBuff[0]);
  323.         A2MinY=atoi(&A2YMinBuff[0]);
  324.         A2MaxX=atoi(&A2XMaxBuff[0]);
  325.         A2MaxY=atoi(&A2YMaxBuff[0]);
  326.         MaxIt=atoi(&MIBuff[0]);
  327.         Margin=atoi(&MargBuff[0]);
  328.         ColJump=atoi(&ColBuff[0]);
  329.         if (ColJump<1) ColJump=-1;
  330.         if (DMReqGadget[31].Flags&SELECTED) EnterOnEdge=1; else EnterOnEdge=0;
  331.         if (A1MinX<2) A1MinX=2;
  332.         if (A1MinY<2) A1MinY=2;
  333.         if ((A2MinX<2)&&(A2MinX!=-1)) A2MinX=2;
  334.         if (A2MinY<2) A2MinY=2;
  335.         if (A1MaxX>XSize-3) A1MaxX=XSize-3;
  336.         if (A1MaxY>YSize-3) A1MaxY=YSize-3;
  337.         if (A2MaxX>XSize-3) A2MaxX=XSize-3;
  338.         if (A2MaxY>YSize-3) A2MaxY=YSize-3;
  339.         if (A1MinX>XSize-3) A1MinX=XSize-3;
  340.         if (A1MinY>YSize-3) A1MinY=YSize-3;
  341.         if (A2MinX>XSize-3) A2MinX=XSize-3;
  342.         if (A2MinY>YSize-3) A2MinY=YSize-3;
  343.         if (MaxIt<2) MaxIt=2;
  344.         if (Margin>MaxIt) Margin=MaxIt;
  345.         if (Margin<2) Margin=2;
  346.         code++;
  347.         /*printf("Current Blit Code is : %d\n",code);*/
  348.     }
  349.     else
  350.     {
  351.         DMReqGadget[1].Flags&=!SELECTED;
  352.         for (msg=GetMsg(w->UserPort);msg!=NULL;ReplyMsg(msg),
  353.                 msg=GetMsg(w->UserPort));
  354.         if (Die==1) DMReqGadget[2].Flags|=SELECTED; else DMReqGadget[2].Flags&=!SELECTED;
  355.         if (MoveBits&1) DMReqGadget[3].Flags|=SELECTED; else DMReqGadget[3].Flags&=!SELECTED;
  356.         if (MoveBits&2) DMReqGadget[4].Flags|=SELECTED; else DMReqGadget[4].Flags&=!SELECTED;
  357.         if (MoveBits&4) DMReqGadget[5].Flags|=SELECTED; else DMReqGadget[5].Flags&=!SELECTED;
  358.         if (MoveBits&8) DMReqGadget[6].Flags|=SELECTED; else DMReqGadget[6].Flags&=!SELECTED;
  359.         if (MoveBits&16) DMReqGadget[7].Flags|=SELECTED; else DMReqGadget[7].Flags&=!SELECTED;
  360.         if (MoveBits&32) DMReqGadget[8].Flags|=SELECTED; else DMReqGadget[8].Flags&=!SELECTED;
  361.         if (MoveBits&64) DMReqGadget[9].Flags|=SELECTED; else DMReqGadget[9].Flags&=!SELECTED;
  362.         if (MoveBits&128) DMReqGadget[10].Flags|=SELECTED; else DMReqGadget[10].Flags&=!SELECTED;
  363.         if (TestBits&1) DMReqGadget[11].Flags|=SELECTED; else DMReqGadget[11].Flags&=!SELECTED;
  364.         if (TestBits&2) DMReqGadget[12].Flags|=SELECTED; else DMReqGadget[12].Flags&=!SELECTED;
  365.         if (TestBits&4) DMReqGadget[13].Flags|=SELECTED; else DMReqGadget[13].Flags&=!SELECTED;
  366.         if (TestBits&8) DMReqGadget[14].Flags|=SELECTED; else DMReqGadget[14].Flags&=!SELECTED;
  367.         if (TestBits&16) DMReqGadget[15].Flags|=SELECTED; else DMReqGadget[15].Flags&=!SELECTED;
  368.         if (TestBits&32) DMReqGadget[16].Flags|=SELECTED; else DMReqGadget[16].Flags&=!SELECTED;
  369.         if (TestBits&64) DMReqGadget[17].Flags|=SELECTED; else DMReqGadget[17].Flags&=!SELECTED;
  370.         if (TestBits&128) DMReqGadget[18].Flags|=SELECTED; else DMReqGadget[18].Flags&=!SELECTED;
  371.         if (EnterOnEdge==1) DMReqGadget[31].Flags|=SELECTED; else DMReqGadget[31].Flags&=!SELECTED;
  372.         j=0;
  373.     }
  374.     sprintf(&A1XMinBuff[0],"%d",A1MinX);
  375.     sprintf(&A2XMinBuff[0],"%d",A2MinX);
  376.     sprintf(&A1YMinBuff[0],"%d",A1MinY);
  377.     sprintf(&A2YMinBuff[0],"%d",A2MinY);
  378.     sprintf(&A1XMaxBuff[0],"%d",A1MaxX);
  379.     sprintf(&A2XMaxBuff[0],"%d",A2MaxX);
  380.     sprintf(&A1YMaxBuff[0],"%d",A1MaxY);
  381.     sprintf(&A2YMaxBuff[0],"%d",A2MaxY);
  382.     sprintf(&MIBuff[0],"%d",MaxIt);
  383.     sprintf(&MargBuff[0],"%d",Margin);
  384.     sprintf(&XSBuff[0],"%d",XSize);
  385.     sprintf(&YSBuff[0],"%d",YSize);
  386.     sprintf(&ColBuff[0],"%ld",ColJump);
  387.     return(j);
  388. }
  389.  
  390. ChangeSize()
  391. {
  392.     if (XSize<10) XSize=10;
  393.     if (YSize<10) YSize=10;
  394.     if (XSize>640) XSize=640;
  395.     if ((Pal)&&(YSize>511)) YSize=511;
  396.     if ((!Pal)&&(YSize>399)) YSize=399;
  397.     if ((XSize<321)&&(HiRes==1))
  398.     {
  399.         for (;!ClearDMRequest(w););
  400.         if (w) CloseWindow(w);
  401.         if (s) CloseScreen(s);
  402.         ns.ViewModes&=(!HIRES);
  403.         ns.Width=320;
  404.         if (!(s=(struct Screen *)OpenScreen(&ns)))
  405.             abort(104);
  406.         LoadRGB4(&s->ViewPort,&ColorMap[0],(long)1<<Planes);
  407.         nw.Screen=s;
  408.         nw.Width=320;
  409.         BigGad.Width=nw.Width;
  410.         if (!(w = (struct Window *) OpenWindow(&nw))) 
  411.             abort(105);
  412.         MySetDMRequester();
  413.         HiRes=0;
  414.     }
  415.     if ((XSize>320)&&(XSize<641)&&(HiRes==0))
  416.     {
  417.         for (;!ClearDMRequest(w););
  418.         if (w) CloseWindow(w);
  419.         if (s) CloseScreen(s);
  420.         ns.ViewModes|=HIRES;
  421.         ns.Width=640;
  422.         if (Planes==5) ns.Depth=4;
  423.         if (!(s=(struct Screen *)OpenScreen(&ns)))
  424.             abort(104);
  425.         LoadRGB4(&s->ViewPort,&ColorMap[0],(long)1<<Planes);
  426.         nw.Screen=s;
  427.         nw.Width=640;
  428.         BigGad.Width=nw.Width;
  429.         if (!(w = (struct Window *) OpenWindow(&nw))) 
  430.             abort(105);
  431.         MySetDMRequester();
  432.         HiRes=1;
  433.     }
  434.     if (Pal)
  435.     {
  436.         if ((YSize<256)&&(Lace==1))
  437.         {
  438.             for (;!ClearDMRequest(w););
  439.             if (w) CloseWindow(w);
  440.             if (s) CloseScreen(s);
  441.             ns.ViewModes&=(!LACE);
  442.             ns.Height=256;
  443.             if (!(s=(struct Screen *)OpenScreen(&ns)))
  444.                 abort(104);
  445.             LoadRGB4(&s->ViewPort,&ColorMap[0],(long)1<<Planes);
  446.             nw.Screen=s;
  447.             nw.Height=255;
  448.             BigGad.Height=nw.Height;
  449.             if (!(w = (struct Window *) OpenWindow(&nw))) 
  450.                 abort(105);
  451.             MySetDMRequester();
  452.             Lace=0;
  453.         }
  454.         if ((YSize>255)&&(Lace==0))
  455.         {
  456.             for (;!ClearDMRequest(w););
  457.             if (w) CloseWindow(w);
  458.             if (s) CloseScreen(s);
  459.             ns.ViewModes|=LACE;
  460.             ns.Height=512;
  461.             if (!(s=(struct Screen *)OpenScreen(&ns)))
  462.                 abort(104);
  463.             LoadRGB4(&s->ViewPort,&ColorMap[0],(long)1<<Planes);
  464.             nw.Screen=s;
  465.             nw.Height=511;
  466.             BigGad.Height=nw.Height;
  467.             if (!(w = (struct Window *) OpenWindow(&nw))) 
  468.                 abort(105);
  469.             MySetDMRequester();
  470.             Lace=1;
  471.         }
  472.     }
  473.     else
  474.     {
  475.         if ((YSize<200)&&(Lace==1))
  476.         {
  477.             for (;!ClearDMRequest(w););
  478.             if (w) CloseWindow(w);
  479.             if (s) CloseScreen(s);
  480.             ns.ViewModes&=(!LACE);
  481.             ns.Height=200;
  482.             if (!(s=(struct Screen *)OpenScreen(&ns)))
  483.                 abort(104);
  484.             LoadRGB4(&s->ViewPort,&ColorMap[0],(long)1<<Planes);
  485.             nw.Screen=s;
  486.             nw.Height=199;
  487.             BigGad.Height=nw.Height;
  488.             if (!(w = (struct Window *) OpenWindow(&nw))) 
  489.                 abort(105);
  490.             MySetDMRequester();
  491.             Lace=0;
  492.         }
  493.         if ((YSize>199)&&(Lace==0))
  494.         {
  495.             for (;!ClearDMRequest(w););
  496.             if (w) CloseWindow(w);
  497.             if (s) CloseScreen(s);
  498.             ns.ViewModes&=LACE;
  499.             ns.Height=400;
  500.             if (!(s=(struct Screen *)OpenScreen(&ns)))
  501.                 abort(104);
  502.             LoadRGB4(&s->ViewPort,&ColorMap[0],(long)1<<Planes);
  503.             nw.Screen=s;
  504.             nw.Height=399;
  505.             BigGad.Height=nw.Height;
  506.             if (!(w = (struct Window *) OpenWindow(&nw))) 
  507.                 abort(105);
  508.             MySetDMRequester();
  509.             Lace=1;
  510.         }
  511.     }
  512. }
  513.  
  514. OpenAll()
  515. {
  516.     if (!(GfxBase = (struct GfxBase *) OpenLibrary("graphics.library",0L)))
  517.         abort(101);
  518.     if (GfxBase->NormalDisplayRows==200) Pal=0;
  519.  
  520.     if (!(IntuitionBase = (struct IntuitionBase *) OpenLibrary("intuition.library", 0L)))
  521.         abort(102);
  522.  
  523.     if(!(IFFBase = OpenLibrary(IFFNAME,IFFVERSION)))
  524.         abort(103);
  525.     ns.Depth=Planes;
  526.     if (!Pal)
  527.         ns.Height=200;
  528.     if (!(s=(struct Screen *)OpenScreen(&ns)))
  529.         abort(104);
  530.     
  531.     LoadRGB4(&s->ViewPort,&ColorMap[0],(long)1<<Planes);
  532.     nw.Screen=s;
  533.     if (!Pal)
  534.     {
  535.         nw.Height=BigGad.Height=YSize=199;
  536.         A1MaxY=A1MinY=197;
  537.         strcpy(A1YMinBuff,"197");
  538.         strcpy(A1YMaxBuff,"197");
  539.         strcpy(YSBuff,"199");
  540.     }
  541.     if (!(w = (struct Window *) OpenWindow(&nw))) 
  542.         abort(105);
  543.     MySetDMRequester();
  544. }
  545.  
  546. abort(exitcode)
  547. {
  548.     for (;!ClearDMRequest(w););
  549.     if (w) CloseWindow(w);
  550.     if (s) CloseScreen(s);
  551.     if (IFFBase) CloseLibrary(IFFBase);
  552.     if (GfxBase) CloseLibrary(GfxBase);
  553.         OpenWorkBench();
  554.     if (IntuitionBase) CloseLibrary(IntuitionBase);
  555.     exit(exitcode);
  556. }
  557.  
  558. DisplayUsage()
  559. {
  560.     puts("IceFrac - A Diffusion Limited Aggregation simulator.");
  561.     puts("Usage: IceFrac [-P#planes]");
  562.     puts("1989 By Lars R. Clausen");
  563.     puts("Critics, comments & contributions are welcome.");
  564.     exit(0);
  565. }
  566. main(argc,argv)
  567. int argc;
  568. char *argv[];
  569. {
  570.     struct IntuiMessage *msg;
  571.     register int t,maxx,minx,maxy,miny;
  572.     long sec,mic,i,j=2;
  573.     int iffcount=0,alldone=0;
  574.     register long x,y,dir;
  575.  
  576.     if (argc==2)
  577.     {
  578.         if (toupper(argv[1][1])=='P') Planes=atoi(&argv[1][2]);
  579.         else DisplayUsage();
  580.     }
  581.     ColCount=ColJump;
  582.     OpenAll();
  583.     CurrentTime(&sec,&mic);
  584.     sec=mic; mic>>8; mic+=sec;
  585.     srand((int)mic);
  586.     if (!A2Off)
  587.     {
  588.         if (A1MinX>A2MinX) minx=A2MinX-Margin;
  589.         else minx=A1MinX-Margin;
  590.         if (A1MaxX>A2MaxX) maxx=A1MaxX+Margin;
  591.         else maxx=A2MaxX+Margin;
  592.         if (A1MinY>A2MinY) miny=A2MinY-Margin;
  593.         else miny=A1MinY-Margin;
  594.         if (A1MaxY>A2MaxY) maxy=A1MaxY+Margin;
  595.         else maxy=A2MaxY+Margin;
  596.     }
  597.     else
  598.     {
  599.         minx=A1MinX-Margin;
  600.         maxx=A1MaxX+Margin;
  601.         miny=A1MinY-Margin;
  602.         maxy=A1MaxY+Margin;
  603.     }
  604.     if (minx<1) minx=1;
  605.     if (maxx>XSize-2) maxx=XSize-2;
  606.     if (miny<1) miny=1;
  607.     if (maxy>YSize-2) maxy=YSize-2;
  608.     SetAPen(w->RPort,1L);
  609.     RectFill(w->RPort,(long)A1MinX,(long)A1MinY,(long)A1MaxX,(long)A1MaxY);
  610.     if (!A2Off)RectFill(w->RPort,(long)A2MinX,(long)A2MinY,(long)A2MaxX,(long)A2MaxY);
  611.     for (;;)
  612.     {
  613.         i=0;
  614.         do
  615.         {
  616.             x=rand()%(maxx-minx)+minx;
  617.             y=rand()%(maxy-miny)+miny;
  618.             if (EnterOnEdge==1)
  619.             {
  620.                 if (rand()%(maxx-minx+maxy-miny)<maxy-miny)
  621.                     if (rand()%2==1) x=minx;
  622.                     else x=maxx;
  623.                 else
  624.                     if (rand()%2==1) y=miny;
  625.                     else y=maxy;
  626.             }
  627.             alldone=0;
  628.             if (i++>=100)
  629.             {
  630.                 alldone=1;
  631.                 for (x=minx,y=miny;(x<=maxx)&&(alldone==1);x++)
  632.                     if (ReadPixel(w->RPort,x,(long)miny)==0) alldone=0;
  633.                 x--;
  634.                 if (alldone==1)
  635.                 {
  636.                     for (x=minx,y=miny;(y<=maxy)&&(alldone==1);y++)
  637.                         if (ReadPixel(w->RPort,(long)minx,y)==0) alldone=0;
  638.                     y--;
  639.                 }
  640.                 if (alldone==1)
  641.                 {
  642.                     for (x=maxx,y=miny;(y<=maxy)&&(alldone==1);y++)
  643.                         if (ReadPixel(w->RPort,(long)maxx,y)==0) alldone=0;
  644.                     y--;
  645.                 }
  646.                 if (alldone==1)
  647.                 {
  648.                     for (x=minx,y=maxy;(x<=maxx)&&(alldone==1);x++)
  649.                         if (ReadPixel(w->RPort,x,(long)maxy)==0) alldone=0;
  650.                     x--;
  651.                 }
  652.                 printf("Alldone=%d, x=%ld,y=%ld\n",alldone,x,y);
  653.             }
  654.         }
  655.         while (((x<1)||(x>XSize-2)||(y<1)||(y>YSize-2)||(ReadPixel(w->RPort,x,y)!=0))&&(alldone==0));
  656.         for (t=0;t<MaxIt;t++)
  657.         {
  658. #ifdef USEBLIT
  659. /* Doesn't work yet */
  660.             printf("Blitting at %ld,%ld - code = %ld\n",x-1,y-1,code);
  661.             BltBitMapRastPort(&s->BitMap,x-1,y-1,&w->RPort,x-1,y,3L,3L,code);
  662.             printf("Done\n");
  663.             if (!(*BZero&(1<<13))) t=MaxIt+10;
  664. #else
  665.             if ((TestBits&0x01)&&(ReadPixel(w->RPort,x-1,y-1))) t=MaxIt+10;
  666.             if ((TestBits&0x02)&&(ReadPixel(w->RPort,x,y-1))) t=MaxIt+10;
  667.             if ((TestBits&0x04)&&(ReadPixel(w->RPort,x+1,y-1))) t=MaxIt+10;
  668.             if ((TestBits&0x08)&&(ReadPixel(w->RPort,x-1,y))) t=MaxIt+10;
  669.             if ((TestBits&0x10)&&(ReadPixel(w->RPort,x+1,y))) t=MaxIt+10;
  670.             if ((TestBits&0x20)&&(ReadPixel(w->RPort,x-1,y+1))) t=MaxIt+10;
  671.             if ((TestBits&0x40)&&(ReadPixel(w->RPort,x,y+1))) t=MaxIt+10;
  672.             if ((TestBits&0x80)&&(ReadPixel(w->RPort,x+1,y+1))) t=MaxIt+10;
  673. #endif
  674.             if (t==MaxIt+10)
  675.             {
  676.                 if (x+Margin>maxx) maxx=x+Margin;
  677.                 if (x-Margin<minx) minx=x-Margin;
  678.                 if (y+Margin>maxy) maxy=y+Margin;
  679.                 if (y-Margin<miny) miny=y-Margin;
  680.                 if (maxx>XSize-2) maxx=XSize-2;
  681.                 if (maxy>YSize-2) maxy=YSize-2;
  682.                 if (miny<1) miny=1;
  683.                 if (minx<1) minx=1;
  684.                  if (ColJump>-1) SetAPen(w->RPort,(long)ColCount++/ColJump);
  685.                 if (ColCount>ColJump*(1<<Planes)) ColCount=0;
  686.                  if (ColCount/ColJump==0) ColCount+=ColJump;
  687.                 WritePixel(w->RPort,x,y);
  688.             }
  689.             else
  690.             {
  691.                 dir=rand()%8;
  692.                 if ((dir==0)&&(MoveBits&0x08)) x--;
  693.                 if ((dir==1)&&(MoveBits&0x10)) x++;
  694.                 if ((dir==2)&&(MoveBits&0x02)) y--;
  695.                 if ((dir==3)&&(MoveBits&0x40)) y++;
  696.                 if ((dir==4)&&(MoveBits&0x20)) { y++; x--; }
  697.                 if ((dir==5)&&(MoveBits&0x80)) { y++; x++; }
  698.                 if ((dir==6)&&(MoveBits&0x01)) { y--; x--; }
  699.                 if ((dir==7)&&(MoveBits&0x04)) { y--; x++; }
  700.                 if (Die)
  701.                     if ((x<=1)||(y<=1)||(x>=XSize-2)||(y>=YSize-2))
  702.                     {
  703.                         t=MaxIt;
  704.                     }
  705.             }
  706.         }
  707.         if (alldone) WaitPort(w->UserPort);
  708.         alldone=0;
  709.         if (w->Flags&INREQUEST)
  710.             if ((j=ChangePara())!=0)
  711.             {
  712.                 if (j==1)
  713.                 {
  714.                     SetAPen(w->RPort,1L);
  715.                     Move(w->RPort,0L,0L);
  716.                     ClearScreen(w->RPort);
  717.                     if (A2MinX==-1) A2Off=1; else A2Off=0;
  718.                     RectFill(w->RPort,(long)A1MinX,(long)A1MinY,(long)A1MaxX,(long)A1MaxY);
  719.                     if (!A2Off)
  720.                     {
  721.                         RectFill(w->RPort,(long)A2MinX,(long)A2MinY,(long)A2MaxX,(long)A2MaxY);
  722.                         if (A1MinX>A2MinX) minx=A2MinX-Margin;
  723.                         else minx=A1MinX-Margin;
  724.                         if (A1MaxX>A2MaxX) maxx=A1MaxX+Margin;
  725.                         else maxx=A2MaxX+Margin;
  726.                         if (A1MinY>A2MinY) miny=A2MinY-Margin;
  727.                         else miny=A1MinY-Margin;
  728.                         if (A1MaxY>A2MaxY) maxy=A1MaxY+Margin;
  729.                         else maxy=A2MaxY+Margin;
  730.                     }
  731.                     else
  732.                     {
  733.                         minx=A1MinX-Margin;
  734.                         maxx=A1MaxX+Margin;
  735.                         miny=A1MinY-Margin;
  736.                         maxy=A1MaxY+Margin;
  737.                     }
  738.                     if (minx<1) minx=1;
  739.                     if (maxx>XSize-2) maxx=XSize-2;
  740.                     if (miny<1) miny=1;
  741.                     if (maxy>YSize-2) maxy=YSize-2;
  742.                     }
  743.                 }
  744.         if (msg=GetMsg(w->UserPort))/* User messages */
  745.         {
  746.             if (msg->Class==VANILLAKEY)
  747.             {
  748.                 if (msg->Code==27) abort(0);
  749.                 if (msg->Code==32)
  750.                 {
  751.                     if (!SaveBitMap(ifffile,&s->BitMap,0L,1L))
  752.                         puts("Error in saving picture");
  753.                     ifffile[10]++;
  754.                     if (ifffile[10]==58)
  755.                     {
  756.                         ifffile[9]++;
  757.                         ifffile[10]=48;
  758.                         if (ifffile[9]==58)
  759.                         {
  760.                             ifffile[9]=48;
  761.                             ifffile[8]++;
  762.                         }
  763.                     }
  764.                 }
  765.                 ReplyMsg(msg);
  766.             }
  767.         }
  768.     }
  769.     abort(0);
  770. }
  771.